/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DOM.Estructura;

import Utilidades.IIterador;
import java.util.ArrayList;

/**
 * Representa un nodo de la estructura recursiva del arbol XML representado a traves de un Composite
 * con la implementacion de la interface IComponente la cual define los metodos.
 * @author Administrador
 */
public class Compuesto implements IComponente {
    private ArrayList<IComponente> hijos;
    private IIterador iteradorComponente;
    protected String nombre;

    /**
     * Crea el compuesto asignandole un nombre, una lista que contendra todos los hijos del componente
     * y un iterador para recorrer dicha lista.
     * @param nom Nombre del compuesto.
     */
    public Compuesto(String nom) {
        nombre=nom;
        hijos = new ArrayList<IComponente>();
        iteradorComponente = new IteradorComponentes(hijos);
    }

    /**
     * Agrega un un hijo al elemento correspondiente
     * @param c compomente a agregar como hijo
     */
    @Override
    public void agregar(IComponente c) {
        hijos.add(c);
    }

    /**
     * Borra un hijo del compuesto
     * @param c hijo a borrar
     */
    @Override
    public void borrar(IComponente c) {
        hijos.remove(c);
    }

    /**
     * Devuelve un iterador para recorrer los hijos del compuesto
     * @return Iterador
     */
    @Override
    public IIterador IteradorDeComponentes() {
        return(this.iteradorComponente);
    }

    /**
     * Determina si el compuesto tiene hijos
     * @return True si tiene hijos, false en caso contrario
     */
    @Override
    public Boolean tieneHijos() {
        return (this.hijos.size() > 0);
    }

    /**
     * Devuelve el nombre del compuesto
     * @param nombre nuevo nombre del compuesto
     */
    public void setNombre(String nombre) {
        this.nombre=nombre;
    }

    /**
     * Devuelve el nombre del atributo
     * @return nombre del compuesto
     */
    public String getNombre() {
        return this.nombre;
    }

    /**
     * Determina si el componente recibido por parametro es igual al compuesto
     * @param c Componente a comparar
     * @return True si son iguales, false en caso contrario
     */
    public Boolean compareTo(IComponente c) {
        return (this.hashCode() == c.hashCode());
    }

}
